# -*- coding: utf-8 -*-
import argparse

class HelpGenerator:
    """帮助信息生成器，用于根据命令和参数自动生成帮助内容"""
    
    @staticmethod
    def generate_main_help(parser):
        """根据主解析器生成主帮助信息"""
        help_lines = []
        help_lines.append("资产收集系统帮助信息:")
        help_lines.append("")
        
        # 获取子命令解析器
        subparsers_action = None
        for action in parser._actions:
            if isinstance(action, argparse._SubParsersAction):
                subparsers_action = action
                break
        
        # 添加主命令
        if subparsers_action:
            for command_name in sorted(subparsers_action.choices.keys()):
                command_parser = subparsers_action.choices[command_name]
                description = command_parser.description or "无描述"
                help_lines.append(f"  {command_name} - {description}")
        
        # 添加通用命令
        help_lines.append("  exit/quit/q - 退出系统")
        help_lines.append("  help - 显示此帮助信息")
        
        # 添加使用示例
        help_lines.append("")
        help_lines.append("使用方法示例:")
        help_lines.append("  python main.py asset add --name 测试资产 --ip 192.168.1.1 --port 80 --protocol http")
        help_lines.append("  python main.py asset search 192.168.1.1")
        help_lines.append("  python main.py asset getall")
        
        help_lines.append("")
        help_lines.append("更多帮助:")
        help_lines.append("  python main.py asset help - 查看资产管理命令帮助")
        
        return '\n'.join(help_lines)
    
    @staticmethod
    def generate_asset_help(asset_parser):
        """根据资产解析器生成资产管理命令帮助信息"""
        help_lines = []
        help_lines.append("资产管理命令帮助信息:")
        help_lines.append("")
        
        # 获取子命令解析器
        subparsers_action = None
        for action in asset_parser._actions:
            if isinstance(action, argparse._SubParsersAction):
                subparsers_action = action
                break
        
        # 添加所有子命令
        if subparsers_action:
            for subcommand_name in sorted(subparsers_action.choices.keys()):
                subparser = subparsers_action.choices[subcommand_name]
                command_format = HelpGenerator._format_command(subcommand_name, subparser)
                description = subparser.description or "无描述"
                help_lines.append(f"  {command_format} - {description}")
        
        # 添加额外的使用提示
        help_lines.append("")
        help_lines.append("使用提示:")
        help_lines.append("  - 带尖括号< >的参数为必需参数")
        help_lines.append("  - 带方括号[ ]的参数为可选参数")
        
        return '\n'.join(help_lines)
    
    @staticmethod
    def _format_command(command_name, subparser):
        """格式化单个命令的使用格式"""
        command_parts = [f"asset {command_name}"]
        
        # 分离必需和可选的位置参数
        positional_required = []
        positional_optional = []
        
        # 处理位置参数
        for arg in subparser._actions:
            if isinstance(arg, (argparse._StoreAction, argparse._StoreTrueAction, argparse._StoreFalseAction)) and not arg.option_strings:
                # 跳过帮助参数
                if arg.dest == 'help':
                    continue
                
                arg_name = arg.metavar or arg.dest
                # 判断是否为必需参数
                if HelpGenerator._is_required_argument(arg):
                    positional_required.append(f"<{arg_name}>")
                else:
                    positional_optional.append(f"[{arg_name}]")
        
        # 添加位置参数
        command_parts.extend(positional_required)
        command_parts.extend(positional_optional)
        
        # 处理可选参数
        optional_args = []
        for arg in subparser._actions:
            if isinstance(arg, (argparse._StoreAction, argparse._StoreTrueAction, argparse._StoreFalseAction)) and arg.option_strings:
                option_str = arg.option_strings[0]
                arg_name = arg.metavar or arg.dest
                
                if isinstance(arg, (argparse._StoreTrueAction, argparse._StoreFalseAction)):
                    optional_args.append(f"[{option_str}]")
                else:
                    optional_args.append(f"[{option_str} <{arg_name}>]")
        
        # 添加可选参数
        if optional_args:
            command_parts.append("[" + " ".join(optional_args) + "]")
        
        return ' '.join(command_parts)
    
    @staticmethod
    def _is_required_argument(arg):
        """判断参数是否为必需参数"""
        # 检查是否有默认值，无默认值通常是必需的
        if arg.default is not None and arg.default is not argparse.SUPPRESS:
            return False
        # 检查nargs参数
        if arg.nargs == '?':
            return False
        if arg.nargs == '*':
            return False
        if arg.nargs == '+':
            # nargs='+' 表示至少一个，但在命令行中如果没有提供会报错
            # 这里我们将其视为可选，因为帮助文本中通常这样显示
            return False
        # 如果没有选项字符串（位置参数）且没有默认值，通常是必需的
        return not arg.option_strings and arg.default is None
    
    @staticmethod
    def format_command_usage(command_name, parser):
        """格式化特定命令的详细用法信息"""
        # 获取命令的基本用法
        basic_usage = parser.format_usage().strip()
        # 获取命令的帮助描述
        description = parser.description or ""
        
        # 提取参数帮助
        help_text = parser.format_help()
        args_help = []
        
        # 提取选项部分
        if "options:" in help_text:
            args_help_start = help_text.find("options:") + len("options:")
            args_help = help_text[args_help_start:].strip().split('\n')
            
            # 格式化参数帮助
            formatted_args_help = []
            for line in args_help:
                line = line.strip()
                if line:
                    formatted_args_help.append(f"  {line}")
            
            args_help = '\n'.join(formatted_args_help)
        
        # 构建完整的用法信息
        full_usage = [f"命令: {command_name}"]
        if description:
            full_usage.append(f"\n描述: {description}")
        full_usage.append(f"\n用法: {basic_usage}")
        if args_help:
            full_usage.append(f"\n选项:\n{args_help}")
        
        return '\n'.join(full_usage)